/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.unmsm.cinfo.siga.ui.utils;

import java.util.Arrays;
import pe.edu.unmsm.cinfo.siga.datos.Programa;
import pe.edu.unmsm.cinfo.siga.datos.ProgramaModulo;

/**
 *
 * @author lartkma
 */
public class ValidadorPrograma {
    private Programa programa;
    private int indexModulo;
    private String mensaje = "";
    
    public ValidadorPrograma(Programa programa){
        this.programa = programa;
    }
    
    public boolean esValido(){
        if(!tieneNumerosOrdenValidos()){
            mensaje = "El módulo " + programa.getProgramaModuloList().get(indexModulo).getModulo().getModDesc() +
                    " no tiene un número de orden válido";
            return false;
        }else if(!tieneNumerosOrdenSecuenciales()){
            mensaje = "El orden de los módulos no sigue una secuencia válida";
            return false;
        }else{
            return true;
        }
    }
    
    private boolean tieneNumerosOrdenValidos(){
        if(programa.getProgramaModuloList() == null) return true;
        indexModulo = 0;
        for(ProgramaModulo m : programa.getProgramaModuloList()){
            if(m.getPromOrd() < 1 || m.getPromOrd() > programa.getProgramaModuloList().size()) return false;
            indexModulo++;
        }
        return true;
    }
    
    private boolean tieneNumerosOrdenSecuenciales(){
        if(programa.getProgramaModuloList() == null || programa.getProgramaModuloList().isEmpty()) return true;
        boolean[] visitados = new boolean[programa.getProgramaModuloList().size()+1];
        Arrays.fill(visitados, false);
        visitados[0] = true;
        for(ProgramaModulo m : programa.getProgramaModuloList()){
           if(m.getPromOrd() < 1 || m.getPromOrd() > programa.getProgramaModuloList().size()) return false;
           visitados[m.getPromOrd()] = true;
        }
        for(boolean visitado : visitados){
            if(!visitado) return false;
        }
        return true;
    }

    public String getMensaje() {
        return mensaje;
    }
}
